package socket;

import gui.FenetrePrincipale;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JFrame;

import service.Fichier;


public class ThreadSocketGetFile extends Thread {
	// ATTRIBUTS
	private File dossierDest;
	private Fichier fichierDemande;
	private String adresseIP;
	private int port;
	private Socket socket;
	private FileOutputStream fileOutput;
	private PrintWriter pWriterSocket;
	private InputStream streamInput;
	private FenetrePrincipale parent;
	
	// CONSTRUCTEURS
	public ThreadSocketGetFile(File dossierDest, Fichier fichierDemande, String adresseIP, int port, FenetrePrincipale parent) {
		this.dossierDest = dossierDest;
		this.fichierDemande = fichierDemande;
		this.adresseIP = adresseIP;
		this.port = port;
		this.parent = parent;
		System.out.println("new ThreadSocketGetFile - Thread construit");
	}
	
	@Override
	public void run() {
		System.out.println("ThreadSocketGetFile.run");
		if (dossierDest != null && dossierDest.exists() && dossierDest.isDirectory()) {
			
			System.out.println("ThreadSocketGetFile.run - dossierDest validé.");
			if (adresseIP != null && !adresseIP.trim().equals("") && port >= 0 && port <= 65535) {
				
				System.out.println("ThreadSocketGetFile.run - adresse IP et port validés.");
				if (fichierDemande != null && fichierDemande.getMd5() != null && !fichierDemande.getMd5().trim().equals("")) {
					
					try {
						socket = new Socket(adresseIP, port);
						
						// On envoie le MD5 du fichier voulu
						pWriterSocket = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
						pWriterSocket.println(fichierDemande.getMd5());
						System.out.println("ThreadSocketGetFile.run - Envoie du MD5 voulu : " + fichierDemande.getMd5());
						
						getFichier();
					}
					catch (Exception e) { System.err.println("ThreadSocketGetFile.run - Erreur : " + e.getMessage()); }
				}
			}
		}
	}
	
	private void getFichier() {
	    try {
	    	fileOutput = new FileOutputStream(dossierDest + "\\" + fichierDemande.getNomFichier());
		    streamInput = socket.getInputStream();
		    System.out.println("ThreadSocketGetFile.getFichier - Flux récupérés.");
		    
	    	byte buf[] = new byte[1024];
		    int n = 0;
		    System.out.println("ThreadSocketGetFile.getFichier - Ecriture de la socket dans le fichier.");
		    while ((n = streamInput.read(buf)) != -1) {
		    	// Ecrit dans le fichier spécifié
		    	fileOutput.write(buf, 0, n);
		    }
		    System.out.println("ThreadSocketGetFile.getFichier - Fin de l'écriture du fichier.");
		    
		}
	    catch (Exception e) { System.err.println("ThreadSocketGetFile.getFichier - Erreur : " + e.getMessage()); }
	    finally {
	    	deconnexion();
	    }
	}
	
	private void deconnexion() {
		try {
			pWriterSocket.close();
			fileOutput.close();
			streamInput.close();
			socket.close();
			// MAJ du JTree ici
			//parent.majJTree();
			System.out.println("ThreadSocketGetFile.deconnexion - Déconnexion réussie");
		}
		catch (Exception e) { System.err.println("ThreadSocketGetFile.deconnexion - Erreur : " + e.getMessage()); }
	}
}
